package com.gutou.yeaicodemother.ai.service;

import com.gutou.yeaicodemother.ai.model.HtmlCodeResult;
import com.gutou.yeaicodemother.ai.model.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

/**
 * AiCodeGeneratorService 接口
 * 该接口定义了AI代码生成器的服务方法，用于生成不同类型的代码
 */
public interface AiCodeGeneratorService {

    /**
     * 生成HTML代码的方法
     *
     * @param userMessage 用户输入的消息，用于生成相应的HTML代码
     * @return 生成的HTML代码字符串
     * @SystemMessage 注解表示使用系统提示，从指定资源文件中加载提示内容
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode(String userMessage);

    /**
     * 生成多文件代码的方法
     *
     * @param userMessage 用户输入的消息，用于生成相应的多文件代码
     * @return 生成的多文件代码字符串
     * @SystemMessage 注解表示使用系统提示，从指定资源文件中加载提示内容
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(String userMessage);

    /**
     * 生成HTML代码的流式方法
     *
     * @param userMessage 用户输入的消息，用于生成相应的HTML代码
     * @return 生成的HTML代码字符串的Flux流
     * @SystemMessage 注解表示使用系统提示，从指定资源文件中加载提示内容
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    Flux<String> generateHtmlCodeStream(String userMessage);

    /**
     * 生成多文件代码的流式方法
     *
     * @param userMessage 用户输入的消息，用于生成相应的多文件代码
     * @return 生成的多文件代码字符串的Flux流
     * @SystemMessage 注解表示使用系统提示，从指定资源文件中加载提示内容
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStream(String userMessage);

    /**
     * 生成 Vue 项目代码（流式）
     *
     * @param userMessage 用户消息
     * @return 生成过程的流式响应
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt.txt")
    TokenStream generateVueProjectCodeStream(@MemoryId long appId, @UserMessage String userMessage);

}
